/* 使用回调式的新写法 */
#define SDL_MAIN_USE_CALLBACKS

#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>

// 定义必要的全局变量 (一般把 Window 和 Renderer 定义为指针, 不过也可以不这么干,
// 调用函数时自己写的前后一至就好)
SDL_Window* Window;
SDL_Renderer* Renderer;

SDL_AppResult
SDL_AppInit(void** appstate, int argc, char* args[]) {
    (void)appstate;
    (void)argc;
    (void)args;

    // 一次性定义 Window 和 Renderer, 我们不需要什么复杂的操作 (参数1: 窗口名,
    // 参数2: 窗口宽, 参数3: 窗口高, 参数4: 窗口的各种修饰Flag 用经典C式按位与组合
    // 这里选了个全屏 Flag 把窗口宽高的参数覆盖了, 参数5:
    // 承接Window的变量的二阶指针, 参数6: 承接 Renderer的变量的二阶指针)
    if (!SDL_CreateWindowAndRenderer("Sternenstaub", 1000, 618,
                                     SDL_WINDOW_FULLSCREEN, &Window,
                                     &Renderer)) {
        SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Video Error: %s", SDL_GetError());
    }
    // SDL 的函数可以用返回值判定是否成功. SDL_GetError 会返回上一个错误的具体细节
    return SDL_APP_CONTINUE;
}

/*
SDL_AppResult SDL_AppIterate(void *appstate, SDL_Event *event) {
  // 这些参数的类型不能变, 因为得让 SDL 来调用
  switch (event->type) {
    case SDL_EVENT_QUIT:       // 即使全屏也可以通过任务栏 或 Atl+F4 触发
      return SDL_APP_SUCCESS;  // 程序正常结束信号
      break;
    // 这些 case 最好都 break 一下, 不然怎么寄的都不知道
    case SDL_EVENT_KEY_DOWN:
      switch (event->key.key) {
        case SDLK_Q:
          return SDL_APP_SUCCESS;
          break;
      }
      break;
  }
  return SDL_APP_CONTINUE;
}
*/

SDL_AppResult
SDL_AppIterate(void* appstate) {
    (void)appstate;

    /* 很多的 SDL 函数都需要先设置 Renderer Draw Color */
    SDL_SetRenderDrawColor(Renderer, 0, 0, 0, 255);
    SDL_RenderClear(Renderer);
    SDL_SetRenderDrawColor(Renderer, 255, 200, 200, 255);

    /* 暂时用这个就够了, 更复杂的字体支持需要 SDL_ttf 库 */
    SDL_RenderDebugText(Renderer, 10, 10, "hello, sdl");
    SDL_RenderPresent(Renderer);
    SDL_Delay(100); // 以 ms 计的硬延迟, 真正的程序中很少使用
    return SDL_APP_CONTINUE; // 程序正常继续信号
}

void
SDL_AppQuit(void* appstate, SDL_AppResult result) {
    (void)appstate;
    (void)result;
}
